﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data;
using produccion.clases;
using System.IO;
using System.Collections.ObjectModel;
using System.Windows.Controls.Primitives;
using System.Threading;
using System.Globalization;
namespace produccion.forms
{
	/// <summary>
	/// Lógica de interacción para frmSalMP.xaml
	/// </summary>
	public partial class frmSalMP : Window
	{
		MDOgeneral MdoGeneral = new MDOgeneral();//FJRF - Instanciamos la clase para extraer las funciones
		DateTime DtmFecha;//FJRF - para el manejo de las fechas

		String StrCodigoMateriaPrima; //FJRF - Creamos una variable que contenga el codigo de la materia prima
		Double DblCosto = 0;//FJRF - Para tener el valor del costo de la materia prima
		String StrConsulta;//FJRF - Para hacer consultas generales
		DataTable DtConsulta = new DataTable();//FJRF - Obtener el resultado de las consultas
		String StrCodigoActualSeleccionado = "";//FJRF - Variable que guarda el codigo seleccionado antes de cualquier proceso
		String StrCodigoPrimerColorReferencia;//FJRF - Para el manejo del codigo de la referencia
		Boolean BooOrdenamientoGrid = false;
		Boolean BooOrdenamientoGridPrimeraVez = true;
		String StrTipoDeOrden;

		public String StrCodigoOrdenAutomatica;

		CLSENCSAL EncSal = new CLSENCSAL();
		CLSDETSAL DetSal = new CLSDETSAL();
		CLSMAEMAT MaeMat = new CLSMAEMAT();
		CLSMAEPRVP MaePrvP = new CLSMAEPRVP();
		CLSMAEMTP MaeMtp = new CLSMAEMTP();
		CLSMAEPRO MaePro = new CLSMAEPRO();

		ObservableCollection<RegDetSal> Lista = new ObservableCollection<RegDetSal>();
		ObservableCollection<RegDetSal> ListaCopia = new ObservableCollection<RegDetSal>();

		DataTable dtTalla = new DataTable();
		DataTable talla = new DataTable();

		Boolean BooInformacionGuardada;//FJRF - Variable que nos informara si se han guardado o no los datos
		public frmSalMP()
		{
			InitializeComponent();           
		}

		private void btnbuscar_Click(object sender, RoutedEventArgs e)
		{
			DataTable dt = new DataTable();
			FRMbuscar frm = new FRMbuscar(MaePrvP, "buscar", "Codigo", "NOMPRV_PRV", "Codigo");
			frm.ShowDialog();
			txtCodPrv.Text = frm.retorno;
			if (txtCodPrv.Text != "")
			{
				MaePrvP.CODPRV_PRV = txtCodPrv.Text;
				if (MaePrvP.existe())
				{
					 MaePrvP.consultar();
					 txtNomPrv.Text = MaePrvP.NOMPRV_PRV;
				}
				else
				{
					txtNomPrv.Text = "";
					if (rbProduccion.IsChecked == false)//FJRF - Si produccion no esta seleccionado hacemos lo siguiente
					{
						txtCodPrv.Text = "";//FJRF - Limpiamos los datos
					}

				}
			}
		}

		private void rbDevolucion_Checked(object sender, RoutedEventArgs e)
		{
			if (this.IsLoaded)
			{
				if (rbDevolucion.IsChecked == true)
				{
					txtHojNro.Text = EncSal.Consecutivo("D");
					expander1.IsExpanded = false;
					expander1.Visibility = Visibility.Hidden;
					txtbMostrar.Text = "Proveedor";
					txtNomPrv.Visibility = Visibility.Visible;
					btnbuscar.Visibility = Visibility.Visible;

					txtbMostrar.Visibility = Visibility.Visible;//FJRF (20/11/2014) - Se pone visible el objeto
					txtCodPrv.Visibility = Visibility.Visible;//FJRF (20/11/2014) - Se pone visible el objeto

					dgSalida.Margin = new Thickness(22, 166, 0, 0);//FJRF - Movemos de posicion el objeto
					dgSalida.Height = 468;

					ejecutaNuevo();//FJRF - Hacemos que todo sea nuevo 

					dgSalida.Columns[5].Visibility = Visibility.Hidden;//FJRF - Desaparecemos la columna de Estandar
					dgSalida.Columns[6].Visibility = Visibility.Hidden;//FJRF - Desaparecemos la columna de Entregado

					txtCodPrv.Focus();
				}
			}
		}

		private void rbProduccion_Checked(object sender, RoutedEventArgs e)
		{
			if (this.IsLoaded)
			{
				if (rbProduccion.IsChecked == true)
				{
					//txtHojNro.Text = EncSal.Consecutivo("P");

					txtHojNro.Text = "";

					expander1.IsExpanded = true;
					expander1.Visibility = Visibility.Visible;
					txtbMostrar.Text = "Orden";
					txtbMostrar.Visibility = Visibility.Visible;//FJRF - Se pone visible el objeto
					txtCodPrv.Visibility = Visibility.Visible;//FJRF - Se pone visible el objeto

					txtNomPrv.Visibility = Visibility.Hidden;
					btnbuscar.Visibility = Visibility.Hidden;

					dgSalida.Margin = new Thickness(22, 357, 0, 0);//FJRF - Movemos de posicion el objeto
					dgSalida.Height = 275;

					ejecutaNuevo();//FJRF - Hacemos que todo sea nuevo 

					dgSalida.Columns[5].Visibility = Visibility.Visible;//FJRF - Aparecemos la columna de Estandar
					dgSalida.Columns[6].Visibility = Visibility.Visible;//FJRF - Aparecemos la columna de Entregado

					txtCodPrv.Focus();
				}
			}
		}
		private void rbOtros_Checked(object sender, RoutedEventArgs e)
		{
			if (this.IsLoaded)
			{
				if (rbOtros.IsChecked == true)
				{
					txtHojNro.Text = EncSal.Consecutivo("O");
					expander1.IsExpanded = false;
					expander1.Visibility = Visibility.Hidden;

					txtbMostrar.Visibility = Visibility.Hidden;//FJRF (20/11/2014) - Se pone invisible el objeto --> Se quita a peticion de Mauricio
					txtCodPrv.Visibility = Visibility.Hidden;//FJRF (20/11/2014) - Se pone invisible el objeto --> Se quita a peticion de Mauricio
					btnbuscar.Visibility = Visibility.Hidden;//FJRF (20/11/2014) - Se pone invisible el objeto --> Se quita a peticion de Mauricio
					txtNomPrv.Visibility = Visibility.Hidden;//FJRF (20/11/2014) - Se pone invisible el objeto --> Se quita a peticion de Mauricio

					dgSalida.Margin = new Thickness(22, 166, 0, 0);//FJRF - Movemos de posicion el objeto
					dgSalida.Height = 468;

					ejecutaNuevo();//FJRF - Hacemos que todo sea nuevo 

					dgSalida.Columns[5].Visibility = Visibility.Hidden;//FJRF - Desaparecemos la columna de Estandar
					dgSalida.Columns[6].Visibility = Visibility.Hidden;//FJRF - Desaparecemos la columna de Entregado

					txtObs.Focus();
				}
			}
		}

		private void llenarTallaje()
		{
			dtTalla = MaePro.ConsTallaje();            
			foreach (DataRow r in dtTalla.Rows)
			{
				talla.Columns.Add(r[1].ToString());
			}
			DataRow n = talla.NewRow();
			int e = 0;
			foreach (DataRow r in dtTalla.Rows)
			{
				n[e] = "";//r[1];
				e++;
			}
			talla.Rows.Add(n);
			dgTallas.ItemsSource = talla.DefaultView;
			e = 0;
			foreach (DataRow r in dtTalla.Rows)
			{
				if (r[2].ToString() != "")
				{
					//Style s = (Style)this.FindResource("estilo");
					if (String.IsNullOrEmpty(StrCodigoOrdenAutomatica) == true)
					{
						dgTallas.Columns[e].CellStyle = newCellStyleTexto();
					}
					
				}
				e++;
			}
			dgTallas.CanUserAddRows = false;
		}

		public static Style newCellStyleTexto()
		{
			System.Windows.Style style = new Style(typeof(DataGridCell));
			style.Setters.Add(new System.Windows.Setter
			{
				Property = Control.BackgroundProperty, 
				Value = Brushes.Blue
			});
			style.Setters.Add(new System.Windows.Setter
			{
				Property = Control.ForegroundProperty,
				Value = Brushes.White
			});
			return style;
		}
		private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
		{
			PttV_Salir();
		}
		private void btnSalir_Click(object sender, RoutedEventArgs e)
		{
			if (String.IsNullOrEmpty(StrCodigoOrdenAutomatica) == false)//FJRF - Si trae datos entonces
			{
				PttV_ImprimirOrdenQueEstaEn_frmActOrd(txtCodPrv.Text);//FJRF - ImprimimosElNumeroDeLaOrden
			}
			this.Close();//FJRF - Nos salimos
		}
		private void btnNuevo_Click(object sender, RoutedEventArgs e)
		{
			ejecutaNuevo();

			dgSalida.Columns[5].Visibility = Visibility.Hidden;//FJRF - Desaparecemos la columna de Estandar
			dgSalida.Columns[6].Visibility = Visibility.Hidden;//FJRF - Desaparecemos la columna de Entregado

			if (rbDevolucion.IsChecked == true)
			{
				txtCodPrv.Focus();
			}
			if (rbProduccion.IsChecked == true)
			{
				txtCodPrv.Visibility = Visibility.Visible;
				btnbuscar.Visibility = Visibility.Hidden;
				txtNomPrv.Visibility = Visibility.Hidden;

				dgSalida.Columns[5].Visibility = Visibility.Visible;//FJRF - Aparecemos la columna de Estandar
				dgSalida.Columns[6].Visibility = Visibility.Visible;//FJRF - Aparecemos la columna de Entregado

				txtCodPrv.Focus();
			}
			if (rbOtros.IsChecked == true)
			{
				txtObs.Focus();
			}
		}

		public void ejecutaNuevo()
		{
			PttV_LiberarCantidadesSeparadas();//FJRF - Liberamos las cantidades que tenga el grid

			dgSalida.IsReadOnly = false;
			txtHojNro.IsEnabled = true;
			txtCodPrv.IsEnabled = true;
			btnGrabar.IsEnabled = true;
			Lista.Clear();

			txtHojNro.Text = "";//FJRF - Limpiamos el dato

			string tipo = "";
			if (rbDevolucion.IsChecked == true)
			{
				tipo = "D";
				expander1.IsExpanded = false;
				expander1.Visibility = Visibility.Hidden;

				txtHojNro.Text = EncSal.Consecutivo(tipo.ToString());
			}
			if (rbOtros.IsChecked == true)
			{
				tipo = "O";
				expander1.IsExpanded = false;
				expander1.Visibility = Visibility.Hidden;

				txtHojNro.Text = EncSal.Consecutivo(tipo.ToString());
			}
			if (rbProduccion.IsChecked == true)
			{
				tipo = "P";
				expander1.IsExpanded = true;
				expander1.Visibility = Visibility.Visible;

			}

			txtCodPrv.Text = "";//FJRF - Limpiamos los datos
			txtNomPrv.Text = "";

			dtFecSal.SelectedDate = MDOgeneral.DttFechaActualDeValidacionEnElSistema;//FJRF - Ponemos la fecha del dia actual del mes seleccionado por el sistema

			dgSalida.ItemsSource = null;
			Lista.Clear();
			imgFoto.Source = null;
			Lista.Add(new RegDetSal { CODIGO_SAL = "", DESCRIPCION_SAL = "", COLOR_SAL = "", UNICOM_SAL = "", EXIST_SAL = 0, STAND_SAL = 0, ENTREG_SAL = 0, CANT_SAL = 0, COSTO_SAL = 0, SUBTOTAL_SAL = 0 });
			dgSalida.ItemsSource = Lista;
			dgTallas.ItemsSource = null;
			talla.Clear();
			txtCodCli.Text = "";
			txtPedido.Text = "";
			txtColor.Text = "";
			txtRef.Text = "";
			txtNomRef.Text = "";
			txtObs.Text = "";

			BooInformacionGuardada = false;//FJRF - Informamos que aun no se han guardado los datos
		}
		private void txtHojNro_KeyUp(object sender, KeyEventArgs e)
		{
			PttV_LiberarCantidadesSeparadas();//FJRF - Liberamos las cantidades que tenga el grid

			if (rbProduccion.IsChecked == false)//FJRF - Si produccion no esta seleccionado hacemos lo siguiente
			{
				txtCodPrv.Text = "";//FJRF - Limpiamos los datos
			}

			txtObs.Text = "";
			txtNomPrv.Text = "";
			dtFecSal.Text = "";
			Lista.Clear();
			dgSalida.ItemsSource = null;
			txtCodCli.Text = "";
			txtNomPrv.Text = "";
			txtNomRef.Text = "";
			txtRef.Text = "";
			txtPedido.Text = "";
			txtColor.Text = "";
			dtTalla.Clear();
			dgTallas.ItemsSource = null;
			imgFoto.Source = null;
			talla.Clear();
			talla.Rows.Clear();
			talla.Columns.Clear();

			PrivV_BuscarOrden();
		}

		private void Window_KeyDown(object sender, KeyEventArgs e)
		{
			if (e.Key == Key.Enter)
			{
				//System.Windows.Forms.SendKeys.Send("{TAB}");
				KeyEventArgs e1 = new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource,
								 0, Key.Tab);
				e1.RoutedEvent = Keyboard.KeyDownEvent;
				InputManager.Current.ProcessInput(e1);
			}

			var elemento = e.OriginalSource as UIElement;
			if (e.Key == Key.F3 && elemento != null)
			{
				if (MDOgeneral.logBusquedadAbierta == true) { MDOgeneral.logBusquedadAbierta = false; }
			}

			if (e.Key == Key.F4 && elemento != null)
			{
				if (MDOgeneral.logBusquedadAbierta1 == true) { MDOgeneral.logBusquedadAbierta1 = false; }
			}

			if (e.Key == Key.F5 && elemento != null)
			{
				if (MDOgeneral.logBusquedadAbierta2 == true) { MDOgeneral.logBusquedadAbierta2 = false; }
			}
		}
		private void dgSalida_KeyUp(object sender, KeyEventArgs e)
		{
			#region FJRF - Saber Fila y Columna indexada

			int IntColumnaIndexada, IntFilaIndexada;
			DependencyObject dep = (DependencyObject)e.OriginalSource;

			//Stepping through the visual tree
			while ((dep != null) && !(dep is System.Windows.Controls.DataGridCell))
			{
				dep = VisualTreeHelper.GetParent(dep);
			}

			//Is the dep a cell or outside the bounds of Window1?
			if (dep == null | !(dep is System.Windows.Controls.DataGridCell))
			{
				return;
			}
			else
			{
				System.Windows.Controls.DataGridCell cell = new System.Windows.Controls.DataGridCell();
				cell = (System.Windows.Controls.DataGridCell)dep;
				while ((dep != null) && !(dep is DataGridRow))
				{
					dep = VisualTreeHelper.GetParent(dep);
				}

				if (dep == null)
				{
					return;
				}
				int colindex = cell.Column.DisplayIndex;  //this returns COLUMN INDEX
				IntColumnaIndexada = colindex;

				DataGridRow row = dep as DataGridRow;
				System.Windows.Controls.DataGrid dataGrid = ItemsControl.ItemsControlFromItemContainer(row) as System.Windows.Controls.DataGrid;
				int rowindex = dataGrid.ItemContainerGenerator.IndexFromContainer(row); //this returns ROW INDEX

				IntFilaIndexada = rowindex;
			}
			#endregion

			int i = IntFilaIndexada;
			int j = IntColumnaIndexada;

			StrCodigoMateriaPrima = "";//FJRF - Limpiamos la variable para inicializarla vacia

			RegDetSal Rg = new RegDetSal();
			if (j == 0)
			{
				if (e.Key == Key.F2)
				{
					if (btnGrabar.IsEnabled == true)
					{
						FRMBuscarCol frm = new FRMBuscarCol();
						frm.EsReferencia = false;
						frm.RequiereColor = true;
						frm.ShowDialog();
						if (frm.Retorno == "")//FJRF - Si devuelve vacio es porque trae un conjunto de datos... entonces hacemos lo siguiente
						{
							for (int k = 0; k < frm.dtRetorno.Rows.Count; k++)//FJRF - Recorremos los datos que retorna
							{
								if ((k + i) > i)
								{
									Lista.Add(new RegDetSal { CODIGO_SAL = "" });//FJRF - Adicionamos un registro a la lista
								}
								Rg = Lista[(i + k)];//FJRF - Decimos que el nuevo registro va a ser igual al detalle de la salida [RegDetSal]

								String StrDatoExtraidoDeLoRetornado = frm.dtRetorno.Rows[k][0].ToString();//FJRF - Extraemos el que se retorno en el formulario que trae las materias primas con los colores y lo trae en la columna cero [0] de la fila que se esta recorriendo

								if (StrDatoExtraidoDeLoRetornado.Length == 10)//FJRF - Preguntamos si el codigo llega de 10 [6 del material] y [4 del color]
								{
									Rg.CODIGO_SAL = StrDatoExtraidoDeLoRetornado;//FJRF - Asignamos el valor encontrado 
								}
								else//FJRF - Si los datos son diferentes a 10 le enviamos la funcion para que separe datos y nos traiga el codigo
								{
									StrCodigoMateriaPrima = MdoGeneral.PasarCadenaYRetornarCodigoONombre(StrDatoExtraidoDeLoRetornado, "-", "Codigo");//FJRF - Extraemos el codigo de la materia prima
									Rg.CODIGO_SAL = StrCodigoMateriaPrima;//FJRF - Enviamos el codigo 
								}

								#region FJRF - AveriguamosElCosto
								if (String.IsNullOrEmpty(Rg.CODIGO_SAL) == true)
								{
									DblCosto = 0;
								}
								else
								{
									DtConsulta = new DataTable();
									StrConsulta = "SELECT VALOR_PMP AS COSTO FROM PREMTPP WHERE CODLIS_PMP = '99' AND CODMAT_PMP = '" + Rg.CODIGO_SAL.Substring(0, 6) + "' AND CODCOL_PMP = '" + Rg.CODIGO_SAL.Substring(6, 4) + "'";
									DtConsulta = MdoGeneral.consulta(StrConsulta);

									if (DtConsulta.Rows.Count > 0)
									{
										DblCosto = Double.Parse(DtConsulta.Rows[0][0].ToString());
									}
									else
									{
										DblCosto = 0;
									}
								}
								#endregion

								Rg.COSTO_SAL = DblCosto;//FJRF - Enviamos el valor del costo averiguado
							}
						}
						else//FJRF - Si no es vacio es porque trae solo un dato
						{
							Rg = Lista[i];//FJRF - Decimos que el nuevo registro va a ser igual al detalle de la salida [RegDetSal]

							StrCodigoMateriaPrima = MdoGeneral.PasarCadenaYRetornarCodigoONombre(frm.Retorno, "-", "Codigo");//FJRF - Extraemos el codigo de la materia prima
							Rg.CODIGO_SAL = StrCodigoMateriaPrima;//FJRF - Enviamos el codigo

							#region FJRF - AveriguamosElCosto
							if (String.IsNullOrEmpty(Rg.CODIGO_SAL) == true)
							{
								DblCosto = 0;
							}
							else
							{
								DtConsulta = new DataTable();
								StrConsulta = "SELECT VALOR_PMP AS COSTO FROM PREMTPP WHERE CODLIS_PMP = '99' AND CODMAT_PMP = '" + Rg.CODIGO_SAL.Substring(0, 6) + "' AND CODCOL_PMP = '" + Rg.CODIGO_SAL.Substring(6, 4) + "'";
								DtConsulta = MdoGeneral.consulta(StrConsulta);

								if (DtConsulta.Rows.Count > 0)
								{
									DblCosto = Double.Parse(DtConsulta.Rows[0][0].ToString());
								}
								else
								{
									DblCosto = 0;
								}
							}
							#endregion

							Rg.COSTO_SAL = DblCosto;//FJRF - Enviamos el valor del costo averiguado
						}
					}
				}
				else//FJRF - Si la tecla digitada es diferente a F2 hacemos lo siguiente
				{
					try//FJRF - Esto lo usamos para validar cualquier dato que venga con error en el manejo de las columnas (Puede ser al mover el mouse)
					{
						RegDetSal RgMP = new RegDetSal();//FJRF - Instanciamos los datos
						RgMP = (RegDetSal)dgSalida.SelectedValue;//FJRF - Le decimos con que datos vamos a trabajar
						if (RgMP != null)//FJRF - Validamos que no sea nulo el dato seleccionado
						{
							String StrCodigoActual = RgMP.CODIGO_SAL;////FJRF - Extraemos el codigo seleccionado

							if (StrCodigoActual.Length < 10)//FJRF - Si el codigo es menor a 10 hacemos lo siguiente
							{
								RgMP.DESCRIPCION_SAL = "";//FJRF - Limpiamos los datos
								RgMP.COLOR_SAL = "";//FJRF - Limpiamos los datos
								RgMP.UNICOM_SAL = "";//FJRF - Limpiamos los datos
								RgMP.EXIST_SAL = 0;//FJRF - Limpiamos los datos
								RgMP.CANT_SAL = 0;//FJRF - Limpiamos los datos
								RgMP.COSTO_SAL = 0;//FJRF - Limpiamos los datos
								RgMP.SUBTOTAL_SAL = 0;//FJRF - Limpiamos los datos
							}
						}
					}
					catch (Exception ex)//FJRF - Si se presenta algun error hacemos lo siguiente
					{
					}
				}

			}
		}

		private void dgSalida_PreparingCellForEdit(object sender, DataGridPreparingCellForEditEventArgs e)
		{
			string strNombreColumna = "", StrCodigoDigitado = "";//FJRF - Variable que se  necesitan
			Double DblCantidadReservada = 0;//FJRF - 
			strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

			TextBox textBox = (e.EditingElement as TextBox);//FJRF - Miramos que valor tiene la celda

			if (textBox == null)//FJRF - Si el objeto llega vacio
			{
				return;//FJRF - Si viene nulo nos salimos
			}

			if (String.IsNullOrEmpty(strNombreColumna) == false)//FJRF - Preguntamos si el nombre de la columna tiene datos
			{
				if (strNombreColumna == "Código")//FJRF - Si el dato de la columna es codigo entonces hacemos lo siguiente
				{
					if (String.IsNullOrEmpty(textBox.Text.Trim().Replace("\r", "")) == false)//FJRF - Si tiene algun dato hacemos lo siguiente
					{
						StrCodigoDigitado = textBox.Text.Trim().Replace("\r", "");//FJRF - Asignamos el dato que tenga
					}
					else//FJRF - Si por el contrario no tiene datos hacemos lo siguiente
					{
						StrCodigoDigitado = "";//FJRF - Informamos que no tiene datos digitados dejandolo vacio
					}
					if (StrCodigoDigitado.Length == 10)//FJRF - Si el codigo digitado esta completo con los 10 caracteres entonces hacemos lo siguiente
					{
						RegDetSal RgMP = new RegDetSal();//FJRF - Instanciamos los datos
						RgMP = (RegDetSal)e.Row.Item;//FJRF - Le decimos con que datos vamos a trabajar
						if (RgMP.CODIGO_SAL == "" || RgMP.CODIGO_SAL == null)//FJRF - Si no hay datos hacemos lo siguiente
						{
							return;//FJRF - Nos salimos
						}
						else//FJRF - Si tenemos datos hacemos lo siguiente
						{
							DblCantidadReservada = RgMP.CANT_SAL;//FJRF - Extraemos la cantidad
							if (DblCantidadReservada > 0)//FJRF - Validamos que la cantidad sea mayor a cero para poder realizar algun proceso
							{
								MaeMtp.CODMAT_MTP = StrCodigoDigitado.Substring(0, 6);//FJRF - Enviamos el codigo de la materia prima
								MaeMtp.CODCOL_MTP = StrCodigoDigitado.Substring(6, 4);//FJRF - Enviamos el color de la materia prima
								MaeMtp.CANSEP_MTP = DblCantidadReservada;//FJRF - Enviamos la cantidad
								
								MaeMtp.RestarSep();//FJRF - Restamos la cantidad separada

								RgMP.CANT_SAL = 0;//FJRF - Limpiamos los datos
								RgMP.COSTO_SAL = 0;//FJRF - Limpiamos los datos
								RgMP.SUBTOTAL_SAL = 0;//FJRF - Limpiamos los datos
							}
						}
					}
				}
			}
			//textBox.Background = new SolidColorBrush(Colors.Yellow);//FJRF - Le cambiamos el color a la celda
			textBox.Focus();//FJRF - Pone el foco en el objeto
		}
		protected void PttV_Salir()
		{
			PttV_LiberarCantidadesSeparadas();//FJRF - Liberamos las cantidades que tenga el grid
		}
		protected void PttV_LiberarCantidadesSeparadas()
		{
			if (BooInformacionGuardada == false && btnGrabar.IsEnabled == true)//FJRF - Si no se ha guardado ningun dato y el grabar esta habilitado [Si esta desabilitado significa que consulto algo entonces no se puede descontar nada]
			{
				RegDetSal Rg2 = new RegDetSal();//FJRF - 
				for (int IntFilaActual1 = 0; IntFilaActual1 < Lista.Count; IntFilaActual1++)//FJRF - Recorremos la primera instancia
				{
					Rg2 = Lista[IntFilaActual1];//FJRF - Empezamos a recorrer la segunda instancia
					if (String.IsNullOrEmpty(Rg2.CODIGO_SAL) == false)//FJRF - Si el codigo es diferente de nulo o vacio
					{
						String StrCodigoRecorrido = Rg2.CODIGO_SAL.Trim().Replace("\r", "");//FJRF - Extraemos el codigo
						if (String.IsNullOrEmpty(StrCodigoRecorrido) == false)//FJRF - Si el codigo tiene datos hacemos lo siguiente
						{
							if (StrCodigoRecorrido.Length == 10)//FJRF - Si es un codigo valido de 10 digitos hacemos lo siguiente
							{
								Double DblCantidadReparada = Rg2.CANT_SAL;//FJRF - Extraemos la cantidad
								if (DblCantidadReparada > 0)//FJRF - Si la cantidad separada es mayor a 10 hacemos lo siguiente
								{
									MaeMtp.CODMAT_MTP = StrCodigoRecorrido.Substring(0, 6);//FJRF - Enviamos el codigo de la materia prima
									MaeMtp.CODCOL_MTP = StrCodigoRecorrido.Substring(6, 4);//FJRF - Enviamos el codigo del color
									MaeMtp.CANSEP_MTP = DblCantidadReparada;//FJRF - Enviamos la cantidad separada
									MaeMtp.RestarSep();//FJRF - Restamos las cantidades separadas
								}
							}
						}
					}
				}
			}
		}
		private void dgSalida_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
		{
			string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
			strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

			if (strNombreColumna == "Código")
			{
				int i = dgSalida.SelectedIndex;
				if (i == -1)
				{
					return;
				}
				string strCodigo;
				RegDetSal RgMP = new RegDetSal();
				RgMP = (RegDetSal)e.Row.Item;

				if (RgMP.CODIGO_SAL != null)
				{
					strCodigo = RgMP.CODIGO_SAL.Trim().Replace("\r", "");
					RgMP.CODIGO_SAL = strCodigo;//FJRF - Dejamos el codigo libre de malos formatos

					if (strCodigo == null)
					{
					}
					else
					{
						if (strCodigo.Length > 10)
						{
							MessageBox.Show("La longitud debe ser menor de 10 caracteres", "Salidas", MessageBoxButton.OK, MessageBoxImage.Exclamation);
							RgMP.CODIGO_SAL = "";
							RgMP.DESCRIPCION_SAL = "";
							RgMP.COLOR_SAL = "";//FJRF - Limpiamos el color
							return;
						}
						if (strCodigo.Length == 10)//FJRF - Si el codigo esta completo hacemos lo siguiente
						{
							if (!EncSal.ExisteMP(strCodigo.ToString().Substring(0, 6), strCodigo.ToString().Substring(6, 4)))//FJRF - Buscamos si el codigo existe
							{
								MessageBox.Show("La materia prima no existe", "Pedidos", MessageBoxButton.OK, MessageBoxImage.Exclamation);
								RgMP.CODIGO_SAL = "";//FJRF - Limpiamos el codigo
								RgMP.DESCRIPCION_SAL = "";//FJRF - Limpiamos la descripción
								RgMP.COLOR_SAL = "";//FJRF - Limpiamos el color
								return;//FJRF - Nos salimos
							}
							else//FJRF - Si el codigo existe hacemos lo siguiente
							{
								#region FJRF - ValidamosTodosLosDatos
								if (rbProduccion.IsChecked == true)
								{
									RegDetSal Rg1 = new RegDetSal();//FJRF - Creamos una primera instancia de los datos
									Rg1 = Lista[i];//FJRF - Empezamos recorriedo el primer reguistro de la primera instancia de los datos
									if (Rg1.CODIGO_SAL.Trim().Replace("\r", "").Length == 10)//FJRF - Verificamos que el codigo este completo y no haya limpiado
									{
										if (Rg1.EXIST_SAL < 1)//FJRF - Verificamos que la existencia sea mayor a cero
										{
											Msgbox("PROCESO CANCELADO", "El código ['" + Rg1.CODIGO_SAL.Trim().Replace("\r", "") + "' - '" + Rg1.DESCRIPCION_SAL + "'] no tiene existencias", MessageBoxButton.OK, MessageBoxImage.Stop);//FJRF - Informamos el datos encontrado repetido
										}
										else
										{

											int IntContador;//FJRF - Creamos una variable que nos dira si el codigo esta mas de una vez repetido        
											RegDetSal Rg2 = new RegDetSal();//FJRF - Creamos una segunda instancia de los datos para compararlo con el primero

											for (int IntFilaActual1 = 0; IntFilaActual1 < Lista.Count; IntFilaActual1++)//FJRF - Recorremos la primera instancia
											{
												IntContador = 0;//FJRF - Decimos que no hay registros repetidos inicializando en cero
												for (int IntFilaActual2 = 0; IntFilaActual2 < Lista.Count; IntFilaActual2++)//FJRF - Recorremos la segunda instancia para verificar codigo por codigo
												{
													Rg2 = Lista[IntFilaActual2];//FJRF - Empezamos a recorrer la segunda instancia
													if (Rg1.CODIGO_SAL.Trim().Replace("\r", "") == Rg2.CODIGO_SAL.Trim().Replace("\r", ""))//FJRF - Comparamos cada uno de los registros de la primera instacia con los de la segunda para comprobar que no hay datos repetidos
													{
														IntContador++;//FJRF - Si encontramos un dato lo marcamos como encontrado
													}
													#region FJRF - VerificamosSiNoEstaRepetidoElMaterial
													if (IntContador > 1)//FJRF - Si los datos encontrados son mayores a uno hacemos lo siguiente
													{
														Msgbox("PROCESO CANCELADO", "El código ['" + Rg2.CODIGO_SAL + "' - '" + Rg2.DESCRIPCION_SAL + "'] esta repetido", MessageBoxButton.OK, MessageBoxImage.Stop);//FJRF - Informamos el datos encontrado repetido
														return;//FJRF - Salimos de la funcion porque como se hace en tiempo real no hay necesidad de seguir mirando si hay mas datos repetidos
													}
													#endregion
												}
											}
										}
									}

								}
								else
								{
									int IntContador;//FJRF - Creamos una variable que nos dira si el codigo esta mas de una vez repetido        
									RegDetSal Rg1 = new RegDetSal();//FJRF - Creamos una primera instancia de los datos
									RegDetSal Rg2 = new RegDetSal();//FJRF - Creamos una segunda instancia de los datos para compararlo con el primero

									for (int IntFilaActual1 = 0; IntFilaActual1 < Lista.Count; IntFilaActual1++)//FJRF - Recorremos la primera instancia
									{
										Rg1 = Lista[IntFilaActual1];//FJRF - Empezamos recorriedo el primer reguistro de la primera instancia de los datos
										IntContador = 0;//FJRF - Decimos que no hay registros repetidos inicializando en cero
										for (int IntFilaActual2 = 0; IntFilaActual2 < Lista.Count; IntFilaActual2++)//FJRF - Recorremos la segunda instancia para verificar codigo por codigo
										{
											if (Rg1.CODIGO_SAL.Trim().Replace("\r", "").Length == 10)//FJRF - Verificamos que el codigo este completo y no haya limpiado
											{
												if (Rg1.EXIST_SAL < 1)//FJRF - Verificamos que la existencia sea mayor a cero
												{
													Msgbox("PROCESO CANCELADO", "El código ['" + Rg1.CODIGO_SAL + "' - '" + Rg1.DESCRIPCION_SAL + "'] no tiene existencias", MessageBoxButton.OK, MessageBoxImage.Stop);//FJRF - Informamos el datos encontrado repetido

													//FJRF - LIMPIAMOS TODOS LOS DATOS DEL EN LA FILA ACTUAL DE LA INSTANCIA DONDE ENCONTRAMOS EL SEGUNDO DATO
													Rg1.CODIGO_SAL = "";//FJRF - Limpiamos el dato
													Rg1.DESCRIPCION_SAL = "";//FJRF - Limpiamos el dato
													Rg1.COLOR_SAL = "";//FJRF - Limpiamos el dato
													Rg1.CANT_SAL = 0;//FJRF - Limpiamos el dato
													Rg1.UNICOM_SAL = "";//FJRF - Limpiamos el dato
													Rg1.SUBTOTAL_SAL = 0;//FJRF - Limpiamos el dato
													Rg1.STAND_SAL = 0;//FJRF - Limpiamos el dato
													Rg1.EXIST_SAL = 0;//FJRF - Limpiamos el dato
													Rg1.ENTREG_SAL = 0;//FJRF - Limpiamos el dato
													Rg1.COSTO_SAL = 0;//FJRF - Limpiamos el dato

													return;//FJRF - Nos salimos porque no hay mas existencias
												}
												else//FJRF - Si tiene existencia hacemos lo siguiente
												{
													Rg2 = Lista[IntFilaActual2];//FJRF - Empezamos a recorrer la segunda instancia
													if (Rg1.CODIGO_SAL.Trim().Replace("\r", "") == Rg2.CODIGO_SAL.Trim().Replace("\r", ""))//FJRF - Comparamos cada uno de los registros de la primera instacia con los de la segunda para comprobar que no hay datos repetidos
													{
														IntContador++;//FJRF - Si encontramos un dato lo marcamos como encontrado
													}
													#region FJRF - VerificamosSiNoEstaRepetidoElMaterial
													if (IntContador > 1)//FJRF - Si los datos encontrados son mayores a uno hacemos lo siguiente
													{
														Msgbox("PROCESO CANCELADO", "El código ['" + Rg2.CODIGO_SAL.Trim().Replace("\r", "") + "' - '" + Rg2.DESCRIPCION_SAL + "'] ya existe", MessageBoxButton.OK, MessageBoxImage.Stop);//FJRF - Informamos el datos encontrado repetido

														//FJRF - LIMPIAMOS TODOS LOS DATOS DEL EN LA FILA ACTUAL DE LA INSTANCIA DONDE ENCONTRAMOS EL SEGUNDO DATO
														Rg2.CODIGO_SAL = "";//FJRF - Limpiamos el dato
														Rg2.DESCRIPCION_SAL = "";//FJRF - Limpiamos el dato
														Rg2.COLOR_SAL = "";//FJRF - Limpiamos el dato
														Rg2.CANT_SAL = 0;//FJRF - Limpiamos el dato
														Rg2.UNICOM_SAL = "";//FJRF - Limpiamos el dato
														Rg2.SUBTOTAL_SAL = 0;//FJRF - Limpiamos el dato
														Rg2.STAND_SAL = 0;//FJRF - Limpiamos el dato
														Rg2.EXIST_SAL = 0;//FJRF - Limpiamos el dato
														Rg2.ENTREG_SAL = 0;//FJRF - Limpiamos el dato
														Rg2.COSTO_SAL = 0;//FJRF - Limpiamos el dato

														return;//FJRF - Salimos de la funcion porque como se hace en tiempo real no hay necesidad de seguir mirando si hay mas datos repetidos
													}
													#endregion
												}
											}
										}
									}
								}
								#endregion
							}
						}
					}
				}

			}

			if (strNombreColumna == "Cantidad")
			{
				string strCodigo;
				double dblCant;
				RegDetSal RgMP = new RegDetSal();
				RgMP = (RegDetSal)e.Row.Item;
				if (RgMP != null)
				{
					if (RgMP.CODIGO_SAL == "" || RgMP.CODIGO_SAL == null)
					{
						return;
					}
					strCodigo = RgMP.CODIGO_SAL;
					dblCant = RgMP.CANT_SAL;
					DetSal.CODMAT_DSA = strCodigo.Substring(0, 6);
					DetSal.CODCOL_DSA = strCodigo.Substring(6, 4);
					if (dblCant > DetSal.Existencia())
					{
						Msgbox("PROCESO CANCELADO", "En la materia prima [" + RgMP.CODIGO_SAL + "] - [" + RgMP.DESCRIPCION_SAL + "] La cantidad [" + dblCant + "] supera la existencia [" + DetSal.Existencia() + "]", MessageBoxButton.OK, MessageBoxImage.Stop);//FJRF - Informamos q la existencia es menor a la cantidad solicitada
						RgMP.CANT_SAL = 0;
						return;
					}
					if (dblCant > 0 & strCodigo != "")
					{
						MaeMtp.CODMAT_MTP = strCodigo.Substring(0, 6);
						MaeMtp.CODCOL_MTP = strCodigo.Substring(6, 4);
						MaeMtp.CANSEP_MTP = dblCant;

						RgMP.SUBTOTAL_SAL = RgMP.CANT_SAL * RgMP.COSTO_SAL;//FJRF - Averiguamos el subtotal

						MaeMtp.SumarSep();
					}
				}
			}
		}

		private void dgSalida_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
		{
			if (dgSalida.CurrentCell.Column == null)//FJRF - Validamos que tenga datos y si no tiene datos hacemos lo siguiente
			{
				//FJRF - Por el momento no hacemos nada
			}
			else//FJRF - Si tiene datos hacemos lo siguiente
			{
				string strCodigo;
				if (dgSalida.SelectedIndex.Equals(-1))
				{
					return;
				}
				RegDetSal RgMP = new RegDetSal();
				RgMP = (RegDetSal)e.Row.Item;
				if (RgMP.CODIGO_SAL.Trim().Replace("\r", "") == "" || RgMP.CODIGO_SAL.Trim().Replace("\r", "") == null)
				{
					return;
				}
				strCodigo = RgMP.CODIGO_SAL.Trim().Replace("\r", "");

				if (strCodigo.Equals("") || strCodigo == null)
				{
					return;
				}
				if (strCodigo.Trim().Length < 6)//FJRF - Si el codigo es menor a seis hacer lo siguiente
				{
					return;//FJRF - Nos salimos pues no cumple la condicion para seguir el proceso
				}
				
				DetSal.CODMAT_DSA = strCodigo.Substring(0, 6);

				int i = dgSalida.SelectedIndex; ;
				int j = dgSalida.CurrentCell.Column.DisplayIndex;
				int k = 0;

				int IntCantidadDeVeces = 0;
				RegDetSal Rg = new RegDetSal();
				for (k = 0; k < Lista.Count; k++)
				{
					if (k != i)
					{
						RgMP = Lista[k];
						if (RgMP.CODIGO_SAL.ToString() == strCodigo)
						{
							IntCantidadDeVeces++;
							if (IntCantidadDeVeces > 1)
							{
								MessageBox.Show("El código de material ya ha sido ingresado!", "Salida de MP", MessageBoxButton.OK, MessageBoxImage.Warning);
								RgMP = (RegDetSal)e.Row.Item;
								RgMP.CODIGO_SAL = "";//FJRF - Limpiamos el dato
								RgMP.DESCRIPCION_SAL = "";//FJRF - Limpiamos el dato
								RgMP.COLOR_SAL = "";//FJRF - Limpiamos el dato
								RgMP.CANT_SAL = 0;//FJRF - Limpiamos el dato
								RgMP.UNICOM_SAL = "";//FJRF - Limpiamos el dato
								RgMP.SUBTOTAL_SAL = 0;//FJRF - Limpiamos el dato
								RgMP.STAND_SAL = 0;//FJRF - Limpiamos el dato
								RgMP.EXIST_SAL = 0;//FJRF - Limpiamos el dato
								RgMP.ENTREG_SAL = 0;//FJRF - Limpiamos el dato
								RgMP.COSTO_SAL = 0;//FJRF - Limpiamos el dato
								return;
							}
						}
					}
				}
			}
		}
			
		private void txtNomPrv_LostFocus(object sender, RoutedEventArgs e)
		{
		}

		private void txtCodPrv_TextChanged(object sender, TextChangedEventArgs e)
		{
			txtCodCli.Text = "";
			txtNomPrv.Text = "";
			txtNomRef.Text = "";
			txtRef.Text = "";
			txtPedido.Text = "";
			txtColor.Text = "";
			dtTalla.Clear();
			dgTallas.ItemsSource = null;
			imgFoto.Source = null;
			talla.Clear();
			talla.Rows.Clear();
			talla.Columns.Clear();

			ejecutaProveedor();//FJRF - Buscamos el proveedor

			if (txtNomPrv.Text.Trim() != "")
			{
				txtObs.Focus();
            }

            #region FJRF - Validar si la orden ya se termino
            //if (rbProduccion.IsChecked == true)//FJRF - Si esta seleccionado produccion hacemos lo siguiente
            //{
            //    if (txtCodPrv.Text != "")
            //    {
            //        Decimal DecCantidad;//FJRF - Para saber la cantidad
            //        String StrDato;//FJRF - Para almacear el dato retornado
            //        DataTable DtTmp = new DataTable();

            //        StrConsulta = "select sum(canord_dop) -  sum(candes_dop) as Cantidad from detordp where nroord_dop = '" + txtCodPrv.Text + "'";//FJRF - Armamos la consulta
            //        DtTmp = MdoGeneral.consulta(StrConsulta);//FJRF - Buscamos los datos

            //        if (DtTmp.Rows.Count > 0)
            //        {
            //            StrDato = DtTmp.Rows[0][0].ToString();
            //            if (String.IsNullOrEmpty(StrDato) == false)
            //            {
            //                DecCantidad = Decimal.Parse(StrDato);

            //                if (DecCantidad <= 0)
            //                {
            //                    btnGrabar.IsEnabled = false;//FJRF - Desabilitamos en guardar antes de asignar la fecha para que se puedan consultar los datos
            //                    Msgbox("ADVERTENCIA", "La orden número [ " + txtCodPrv.Text + " ] con cantidad pendiente por entregar [ " + DecCantidad + " ] ya esta terminada y no se posible modificarla, para buscar una nueva orden, presione el botón nuevo para realizar una nueva busqueda", MessageBoxButton.OK, MessageBoxImage.Warning);
            //                }
            //            }
            //        }
            //    }
            //}
            #endregion
        }

		private void txtCodPrv_LostFocus(object sender, RoutedEventArgs e)
		{
			ejecutaProveedor();
		}

		public void ejecutaProveedor()
		{
			if (rbProduccion.IsChecked != true)
			{
				DataTable dt = new DataTable();
				if (txtCodPrv.Text != "")
				{
					MaePrvP.CODPRV_PRV = txtCodPrv.Text;
					if (MaePrvP.existe())
					{
						MaePrvP.consultar();
						txtNomPrv.Text = MaePrvP.NOMPRV_PRV;
					}
					else
					{
						txtNomPrv.Text = "";
					}
				}
				else
				{
					//Msgbox("ADVERTENCIA", "No digito el codigo proveedor", MessageBoxButton.OK, MessageBoxImage.Warning);
				}
			}
			else
			{
				if (txtCodPrv.Text == "")
				{
					//Msgbox("ADVERTENCIA", "No digito el codigo de la orden", MessageBoxButton.OK, MessageBoxImage.Warning);
				}
				else
				{
					if (btnGrabar.IsEnabled == true & rbProduccion.IsChecked == true)
					{
						EncSal.NROORDP_ESA = txtCodPrv.Text;
						DataTable dtDet = new DataTable();
						DataTable dtOrden = new DataTable();
						DataTable dtDetalleOrden = new DataTable();
						dtOrden = EncSal.ConsultarOrden();
						if (dtOrden.Rows.Count == 0)
						{
							return;
						}
						txtHojNro.Text = StrEjecutarSP_NROSALPRD(txtCodPrv.Text);

						txtCodCli.Text = dtOrden.Rows[0][1].ToString();
						txtPedido.Text = dtOrden.Rows[0][5].ToString();
						txtRef.Text = dtOrden.Rows[0][2].ToString();
						txtColor.Text = dtOrden.Rows[0][4].ToString();
						MaePro.CODREF_PRO = txtRef.Text;
						txtNomRef.Text = dtOrden.Rows[0][3].ToString();

						PonerImagen(txtRef.Text, txtColor.Text, txtNomRef.Text);//FJRF - Ponemos el nombre de la referencia
						
						MaePro.CODREF_PRO = txtRef.Text;
						dtTalla.Clear();
						dgTallas.ItemsSource = null;
						talla.Rows.Clear();
						talla.Columns.Clear();
						talla.Clear();
						dtTalla = MaePro.ConsTallaje();
						llenarTallaje();
						dtDetalleOrden = EncSal.DetalleOrden();
						for (int m = 0; m < dtDetalleOrden.Rows.Count; m++)
						{
							for (int n = 0; n < talla.Columns.Count; n++)
							{

								if (dtDetalleOrden.Rows[m][3].ToString() == talla.Columns[n].ColumnName)
								{
									talla.Rows[0][n] = dtDetalleOrden.Rows[m][4];
								}
							}
						}
						dgTallas.ItemsSource = talla.DefaultView;
						EncSal.TIPSAL_ESA = "P";
						EncSal.HOJNRO_ESA = txtHojNro.Text;
						Lista.Clear();
						dgSalida.ItemsSource = null;
						if (EncSal.ExisteSalida() == false)
						{
							CLSMAEEST MaeEst = new CLSMAEEST();
							MaeEst.CODREF_EST = txtRef.Text;
							MaeEst.CODCOL_EST = txtColor.Text;
							dtDet = MaeEst.MaterialEstandar();

							Boolean BooExisteMateriales = false;//FJRF - Esta variable se usara para validar si existen o no materiales

							for (int i = 0; i < dtDet.Rows.Count; i++)
							{
								Lista.Add(new RegDetSal { CODIGO_SAL = dtDet.Rows[i][0].ToString(), STAND_SAL = 0 });
								BooExisteMateriales = true;//FJRF - Informamos que si existen materiales
							}

							Lista.Add(new RegDetSal { CODIGO_SAL = "", DESCRIPCION_SAL = "", COLOR_SAL = "", UNICOM_SAL = "", EXIST_SAL = 0, STAND_SAL = 0, ENTREG_SAL = 0, CANT_SAL = 0, COSTO_SAL = 0, SUBTOTAL_SAL = 0 });//FJRF - Adicionamos un nuevo registro

							dgSalida.ItemsSource = Lista;
							RegDetSal Rg = new RegDetSal();
							for (int i = 0; i < Lista.Count; i++)
							{
								Rg = Lista[i];
								double CantStd, CantOrd;
								CantStd = 0;
								CantOrd = 0;
								for (int n = 0; n < talla.Columns.Count; n++)
								{
									if (talla.Columns[n].ColumnName != "")
									{
										MaeEst.CODREF_EST = txtRef.Text;
										MaeEst.CODCOL_EST = txtColor.Text;
										MaeEst.CODTAL_EST = talla.Columns[n].ColumnName;
										MaeEst.CODMTP_EST = Rg.CODIGO_SAL;
										if (MaeEst.ExisteTallaEnEstandar() == true)
										{
											if (talla.Rows[0][n].ToString() != "")
											{
												CantStd = MaeEst.CantidadEstandar();
												CantOrd = CantOrd + (System.Convert.ToDouble(talla.Rows[0][n].ToString()) * CantStd);
											}
										}
									}
								}
								Rg.STAND_SAL = CantOrd;
								CLSCONORD ConOrd = new CLSCONORD();

								if (String.IsNullOrEmpty(Rg.CODIGO_SAL) == false)//FJRF - Si el codigo no esta nulo o vacio hacemos lo siguiente
								{
									ConOrd.NROORD_COR = txtCodPrv.Text;
									ConOrd.CODMAT_COR = Rg.CODIGO_SAL.Substring(0, 6);
									ConOrd.CODCOL_COR = Rg.CODIGO_SAL.Substring(6, 4);
									Rg.ENTREG_SAL = ConOrd.CantidadEntregada();
								}
							}
						}
					}
				}
			}
		}

		private void btnGrabar_Click(object sender, RoutedEventArgs e)
		{
			if (MessageBox.Show("¿Está seguro guardar la información?", "INICIO DE PROCESO DE GUARDADO", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
			{
				try
				{
					string tipo = "";
					if (rbDevolucion.IsChecked == true)
					{
						tipo = "D";
						txtHojNro.Text = EncSal.Consecutivo(tipo.ToString());
					}
					if (rbOtros.IsChecked == true)
					{
						tipo = "O";
						txtHojNro.Text = EncSal.Consecutivo(tipo.ToString());
					}
					if (rbProduccion.IsChecked == true)
					{
						tipo = "P";
						txtHojNro.Text = StrEjecutarSP_NROSALPRD(txtCodPrv.Text);
					}

					if (txtCodPrv.Text == "")
					{
						if (rbProduccion.IsChecked == true)
						{
							MessageBox.Show("Debe seleccionar una orden", "Grabar órdenes", MessageBoxButton.OK, MessageBoxImage.Exclamation);
							txtCodPrv.Focus();
							return;
						}
						else
						{
							if (rbDevolucion.IsChecked == true)
							{
								MessageBox.Show("Debe seleccionar un proveedor", "Grabar órdenes", MessageBoxButton.OK, MessageBoxImage.Exclamation);
								txtCodPrv.Focus();
								return;
							}
						}

					}

					RegDetSal Rg = new RegDetSal();
					String StrCodigoActual = "";
					for (int i = 0; i < Lista.Count; i++)
					{
						Rg = Lista[i];
						StrCodigoActual = Rg.CODIGO_SAL.Trim();
						StrCodigoActual = StrCodigoActual.Replace("\r", "");
						if (StrCodigoActual != "")
						{
							if (Rg.CANT_SAL < 0)
							{
								MessageBox.Show("Las cantidades no pueden ser negativas!", "Grabar órdenes", MessageBoxButton.OK, MessageBoxImage.Exclamation);
								return;
							}
							if (!EncSal.ExisteMP(Rg.CODIGO_SAL.Substring(0, 6), Rg.CODIGO_SAL.Substring(6, 4)))
							{
								MessageBox.Show("El código " + Rg.CODIGO_SAL + " no existe!", "Grabar órdenes", MessageBoxButton.OK, MessageBoxImage.Exclamation);
								return;
							}
							if (Rg.CANT_SAL > Rg.EXIST_SAL)
							{
								MessageBox.Show("El código " + Rg.CODIGO_SAL + " no tiene existencia suficiente!", "Grabar órdenes", MessageBoxButton.OK, MessageBoxImage.Exclamation);
								return;
							}
						}
					}

					if (dtFecSal.Text == "")
					{
						MessageBox.Show("Debe seleccionar una fecha!", "Grabar órdenes", MessageBoxButton.OK, MessageBoxImage.Exclamation);
						dtFecSal.Focus();
						return;
					}
					if (Lista.Count == 0)
					{
						MessageBox.Show("Debe ingresar productos!", "Grabar órdenes", MessageBoxButton.OK, MessageBoxImage.Exclamation);
						return;
					}

					if (txtObs.Text == "")
					{
						MessageBox.Show("Debe ingresar alguna observación!", "Grabar órdenes", MessageBoxButton.OK, MessageBoxImage.Exclamation);
						return;
					}

					EncSal.TIPSAL_ESA = tipo;

					if (rbProduccion.IsChecked == true)
					{
						txtHojNro.Text = StrEjecutarSP_NROSALPRD(txtCodPrv.Text);
					}
					else
					{
						txtHojNro.Text = EncSal.Consecutivo(tipo);
					}
					
					EncSal.HOJNRO_ESA = txtHojNro.Text;
					if (EncSal.ExisteSalida())
					{
						MessageBox.Show("La salida ya existe!", "Grabar salidas", MessageBoxButton.OK, MessageBoxImage.Exclamation);
						return;
					}
					EncSal.FECSAL_ESA = System.Convert.ToDateTime(dtFecSal.Text);
					EncSal.OBSSAL_ESA = txtObs.Text; ;
					if (tipo == "O")
					{
						EncSal.DESSAL_ESA = "Otros";
						EncSal.NROORDP_ESA = " ";
					}
					if (tipo == "P")
					{
						EncSal.DESSAL_ESA = "Produccion";
						EncSal.NROORDP_ESA = txtCodPrv.Text;
					}
					if (tipo == "D")
					{
						EncSal.DESSAL_ESA = txtCodPrv.Text;
						EncSal.NROORDP_ESA = " ";
					}
					EncSal.ESTADO_ESA = "C";
					EncSal.Grabar(Lista);

					BooInformacionGuardada = true;//FJRF - Informamos que aun se han guardado los datos

					EjecutarSP_PROSALP(tipo, txtHojNro.Text.Trim().ToUpper());//FJRF - Actualizamos los inventarios


					//rImpSal imp = new rImpSal { tipo = tipo, nrosal = txtHojNro.Text };
					//imp.consultar();
					//imp.imprimir();

					PttV_ImprimirOrdenQueEstaEn_frmActOrd(txtCodPrv.Text);//FJRF - ImprimimosElNumeroDeLaOrden

					btnNuevo_Click(null, null);
					new MDOgeneral.notificar(wPnot, "Los cambios fueron guardados correctamente.", true);

                    Msgbox("PROCESO EXITOSO", "Información guardada con exito... " + txtHojNro.Text + " ", MessageBoxButton.OK, MessageBoxImage.Information);

					if (String.IsNullOrEmpty(StrCodigoOrdenAutomatica) == false)//FJRF - Si trae datos entonces
					{
						this.Close();//FJRF - Nos salimos
					}
				}
				catch (Exception ex)
				{
					BooInformacionGuardada = false;//FJRF - Informamos que aun no se han guardado los datos

					MessageBox.Show(ex.Message, "Error al grabar la salida.", MessageBoxButton.OK, MessageBoxImage.Error);
					new MDOgeneral.notificar(wPnot, "Los cambios no pueden ser guardados correctamente.", false);
				}
			}
			else
			{
				Msgbox("PROCESO CANCELADO", "No se guardo la información", MessageBoxButton.OK, MessageBoxImage.Stop);
			}
		}

		private void dgSalida_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
		{
			string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
			strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

			string strCodigo;
			double dblCant;
			if (strNombreColumna == "Código")
			{
				RegDetSal RgMP = new RegDetSal();//FJRF - Instanciamos los datos
				RgMP = (RegDetSal)e.Row.Item;//FJRF - Le decimos con que datos vamos a trabajar
				if (RgMP != null)//FJRF - Validamos que no sea nulo el dato seleccionado
				{
					if (RgMP.CODIGO_SAL == "" || RgMP.CODIGO_SAL == null)
					{
						return;
					}

					strCodigo = RgMP.CODIGO_SAL.Trim().Replace("\r", "");
					dblCant = RgMP.CANT_SAL;
					if (dblCant > 0)
					{
						MaeMtp.CODMAT_MTP = strCodigo.Substring(0, 6);
						MaeMtp.CODCOL_MTP = strCodigo.Substring(6, 4);
						MaeMtp.CANSEP_MTP = dblCant;
						
						MaeMtp.RestarSep();
						
						RgMP.CANT_SAL = 0;
						RgMP.SUBTOTAL_SAL = 0;
					}
				}
			}
			else
			{
				if (strNombreColumna == "Cantidad")
				{
					RegDetSal RgMP = new RegDetSal();
					RgMP = (RegDetSal)e.Row.Item;//FJRF - Establece el registro actual

					if (RgMP != null)
					{
						if (RgMP.CODIGO_SAL == "" || RgMP.CODIGO_SAL == null)
						{
							return;
						}

						strCodigo = RgMP.CODIGO_SAL.Trim().Replace("\r", "");
						dblCant = RgMP.CANT_SAL;
						if (dblCant > 0)
						{
							MaeMtp.CODMAT_MTP = strCodigo.Substring(0, 6);
							MaeMtp.CODCOL_MTP = strCodigo.Substring(6, 4);
							MaeMtp.CANSEP_MTP = dblCant;
							MaeMtp.RestarSep();
						}
					}
				}
			}
		}
		private void txtHojNro_LostFocus(object sender, RoutedEventArgs e)
		{
			PrivV_BuscarOrden();
		}
		private void PrivV_BuscarOrden()
		{
			DataTable dtEnc = new DataTable();
			DataTable dtDet = new DataTable();
			DataTable dtOrden = new DataTable();
			DataTable dtDetalleOrden = new DataTable();
			if (txtHojNro.Text != "")
			{
				if (rbDevolucion.IsChecked == true)
				{
					EncSal.TIPSAL_ESA = "D";
				}
				if (rbOtros.IsChecked == true)
				{
					EncSal.TIPSAL_ESA = "O";
				}
				if (rbProduccion.IsChecked == true)
				{
					EncSal.TIPSAL_ESA = "P";
				}
				EncSal.HOJNRO_ESA = txtHojNro.Text;

				if (EncSal.ExisteSalida())
				{
					dgSalida.Columns[4].Visibility = Visibility.Hidden;//FJRF - desaparecemos la columna de existencia

					EncSal.Consultar();

					btnGrabar.IsEnabled = false;//FJRF - Desabilitamos en guardar antes de asignar la fecha para que se puedan consultar los datos

					dtFecSal.Text = EncSal.FECSAL_ESA.ToString();

					if (rbProduccion.IsChecked == true)
					{
						txtNomPrv.Text = EncSal.NROORDP_ESA;//FJRF - LO PONEMOS ACA EL NUMERO DE LA ORDEN DE PRODUCCION DONDE SE SACARON LOS DATOS PARA QUE NO BUSQUE TODOS LOS DATOS DE LA ORDEN
						txtCodPrv.Visibility = Visibility.Hidden;
						txtNomPrv.Visibility = Visibility.Visible;
					}
					else
					{
						if (rbDevolucion.IsChecked == true)
						{
							txtCodPrv.Text = EncSal.DESSAL_ESA;//FJRF - LO PONEMOS ACA EL NUMERO DE LA ORDEN DE PRODUCCION DONDE SE SACARON LOS DATOS PARA QUE NO BUSQUE TODOS LOS DATOS DE LA ORDEN
						}
					}
					dtOrden = EncSal.ConsultarOrden();

					txtObs.Text = EncSal.OBSSAL_ESA;
					if (EncSal.NROORDP_ESA.Trim() != "")
					{
						txtCodCli.Text = dtOrden.Rows[0][1].ToString();
						txtPedido.Text = dtOrden.Rows[0][0].ToString();
						txtRef.Text = dtOrden.Rows[0][2].ToString();
						MaePro.CODREF_PRO = txtRef.Text;
						txtNomRef.Text = dtOrden.Rows[0][3].ToString();
						txtColor.Text = dtOrden.Rows[0][4].ToString();

						PonerImagen(txtRef.Text, txtColor.Text, txtNomRef.Text);//FJRF - Ponemos el nombre de la referencia

						MaePro.CODREF_PRO = txtRef.Text;
						dtTalla.Clear();
						dgTallas.ItemsSource = null;
						talla.Rows.Clear();
						talla.Columns.Clear();
						talla.Clear();
						dtTalla = MaePro.ConsTallaje();
						llenarTallaje();
					}
					DetSal.TIPSAL_DSA = EncSal.TIPSAL_ESA;
					DetSal.HOJNRO_DSA = EncSal.HOJNRO_ESA;
					dtDet = DetSal.Consultar();
					dtDetalleOrden = EncSal.DetalleOrden();
					for (int m = 0; m < dtDetalleOrden.Rows.Count; m++)
					{
						for (int n = 0; n < talla.Columns.Count; n++)
						{

							if (dtDetalleOrden.Rows[m][3].ToString() == talla.Columns[n].ColumnName)
							{
								talla.Rows[0][n] = dtDetalleOrden.Rows[m][4];
							}
						}
					}
					dgTallas.ItemsSource = talla.DefaultView;
					Lista.Clear();
					dgSalida.ItemsSource = null;
					for (int i = 0; i < dtDet.Rows.Count; i++)
					{
						String StrTmpCodigoMaterial, StrDescripcion, StrCodigoColor, StrUnidad;
						Double DblExistencia = 0, DblStandar = 0, DblEntregado = 0, DblSubTotal;
						String StrCantidadSeparada, StrCosto;
						
						StrTmpCodigoMaterial = dtDet.Rows[i][2].ToString() + dtDet.Rows[i][3].ToString();
						StrDescripcion =  dtDet.Rows[i][7].ToString();
						StrCodigoColor = dtDet.Rows[i][3].ToString();
						StrUnidad = DetSal.UniComMP(dtDet.Rows[i][2].ToString().Substring(0, 6));
						StrCantidadSeparada = dtDet.Rows[i][4].ToString();
						StrCosto = dtDet.Rows[i][5].ToString();
						DblSubTotal = System.Convert.ToDouble(StrCosto) * System.Convert.ToDouble(StrCantidadSeparada);

						Lista.Add(new RegDetSal 
						{
							CODIGO_SAL = StrTmpCodigoMaterial,
							DESCRIPCION_SAL = StrDescripcion,
							COLOR_SAL = StrCodigoColor,
							UNICOM_SAL = StrUnidad,
							EXIST_SAL = DblExistencia,
							STAND_SAL = DblStandar,
							ENTREG_SAL = DblEntregado,
							CANT_SAL = System.Convert.ToDouble(StrCantidadSeparada),
							COSTO_SAL = System.Convert.ToDouble(StrCosto),
							SUBTOTAL_SAL = DblSubTotal 
						});
					}
					dgSalida.ItemsSource = Lista;
					dgSalida.IsReadOnly = true;

					dgSalida.Columns[5].Visibility = Visibility.Hidden;//FJRF - Desaparecemos la columna de Estandar
					dgSalida.Columns[6].Visibility = Visibility.Hidden;//FJRF - Desaparecemos la columna de Entregado
				}
				else
				{
					if (txtHojNro.Text.Length > 6)
					{
						dgSalida.Columns[4].Visibility = Visibility.Visible;//FJRF - Aparecemos la columna de existencia

						ejecutaNuevo();

						if (rbOtros.IsChecked == true)
						{
							txtObs.Focus();
						}
						else
						{
							txtCodPrv.Focus();
						}
					}
				}
			}
		}

		private void Window_Loaded(object sender, RoutedEventArgs e)
		{
			#region FJRF - EstilosParaDataGrid
			//Style MyStyleTransparent = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
			//MyStyleTransparent.Setters.Add(new Setter(BackgroundProperty, Brushes.Transparent));//FJRF - Decimos que el texto se ponga transparente para que tome las propiedades del grid

			//dgSalida.Columns[0].CellStyle = MyStyleTransparent;
			//dgSalida.Columns[1].CellStyle = MyStyleTransparent;
			//dgSalida.Columns[2].CellStyle = MyStyleTransparent;
			//dgSalida.Columns[3].CellStyle = MyStyleTransparent;

			Style MyStyleTextAlignmentProperty = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
			MyStyleTextAlignmentProperty.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));//FJRF - Alineamos los datos de la celda a la derecha

			dgSalida.Columns[4].CellStyle = MyStyleTextAlignmentProperty;
			dgSalida.Columns[5].CellStyle = MyStyleTextAlignmentProperty;
			dgSalida.Columns[6].CellStyle = MyStyleTextAlignmentProperty;
			dgSalida.Columns[7].CellStyle = MyStyleTextAlignmentProperty;
			dgSalida.Columns[8].CellStyle = MyStyleTextAlignmentProperty;
			dgSalida.Columns[9].CellStyle = MyStyleTextAlignmentProperty;
			#endregion

			txtObs.Style = null;

			txtCodPrv.Style = null;

			//FJRF - CON ESTO GARANTIZAMOS QUE LAS FECHAS SIEMPRE VENDRAN EN ESTE FORMATO DE DIA/MES/AÑO
			System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");//FJRF - Con esto aseguramos que la base de datos reciba los numeros como se deben recibir
			Thread.CurrentThread.CurrentCulture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
			Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";//FJRF - Con esto aseguramos que la fecha se vaya en este formato

			dtFecSal.DisplayDateStart = MDOgeneral.DttFechaInicialDeValidacionEnElSistema;//FJRF - Decimos el rango de fechas iniciales que debe mostrar
			dtFecSal.DisplayDateEnd = MDOgeneral.DttFechaFinalDeValidacionEnElSistema;//FJRF - Decimos el rango de fechas finales que debe mostrar

			dtFecSal.SelectedDate = MDOgeneral.DttFechaActualDeValidacionEnElSistema;//FJRF - Ponemos la fecha del dia actual del mes seleccionado por el sistema

			btnGrabar.IsEnabled = false;
			btnImprimir.IsEnabled = true;
			txtHojNro.IsEnabled = false;
			txtCodPrv.IsEnabled = false;

			ejecutaNuevo();//FJRF - Hacemos que todo sea nuevo

			dgSalida.Columns[5].Visibility = Visibility.Hidden;//FJRF - Desaparecemos la columna de Estandar
			dgSalida.Columns[6].Visibility = Visibility.Hidden;//FJRF - Desaparecemos la columna de Entregado

			if (String.IsNullOrEmpty(StrCodigoOrdenAutomatica) == false)
			{
				rbProduccion.IsChecked = true;
				rbProduccion_Checked(null, null);
				txtCodPrv.Text = StrCodigoOrdenAutomatica;

				dgSalida.Focus();//FJRF - Ponemos el foco en el grid
				e.Handled = true;//FJRF - Le decimos que vamos a trabajar sobre un control
				SelectCellByIndex(dgSalida, 0, 0);//FJRF - Le decimos cual es la nueva posicion
			}
			else
			{
				Keyboard.Focus(txtCodPrv);
			}
			
			BooInformacionGuardada = false;//FJRF - Informamos que no se ha guardado ningun dato

		}

		private void btnImprimir_Click(object sender, RoutedEventArgs e)
		{
			if (txtHojNro.Text != "")
			{
				if (rbDevolucion.IsChecked == true)
				{
					EncSal.TIPSAL_ESA = "D";

				}
				if (rbOtros.IsChecked == true)
				{
					EncSal.TIPSAL_ESA = "O";
				}
				if (rbProduccion.IsChecked == true)
				{
					EncSal.TIPSAL_ESA = "P";
				}
				EncSal.HOJNRO_ESA = txtHojNro.Text;
				DetSal.TIPSAL_DSA = EncSal.TIPSAL_ESA;
				DetSal.HOJNRO_DSA = txtHojNro.Text;
				rImpSal imp = new rImpSal { tipo = EncSal.TIPSAL_ESA, nrosal = EncSal.HOJNRO_ESA };
				imp.consultar();

				
				if (String.IsNullOrEmpty(StrCodigoOrdenAutomatica) == false)//FJRF - Si trae datos entonces
				{
					MDOgeneral.strImprimirNoCopias = "1-frmSalMP(btnImprimir_Click)";
					PttV_ImprimirOrdenQueEstaEn_frmActOrd(txtCodPrv.Text);//FJRF - ImprimimosElNumeroDeLaOrden
				}
				else//FJRF - Si no trae es porq estamos trabajando con el formulario como que es
				{
					imp.imprimir();//FJRF - Este es el imprimir anterior
				}

			}
		}



		public DataGridCell GetCell(int rowIndex, int columnIndex, DataGrid dg)
		{
			DataGridRow row = dg.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
			DataGridCellsPresenter p = GetVisualChild<DataGridCellsPresenter>(row);
			DataGridCell cell = p.ItemContainerGenerator.ContainerFromIndex(columnIndex) as DataGridCell;
			return cell;
		}

		static T GetVisualChild<T>(Visual parent) where T : Visual
		{
			T child = default(T);
			int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
			for (int i = 0; i < numVisuals; i++)
			{
				Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
				child = v as T;
				if (child == null)
				{
					child = GetVisualChild<T>(v);
				}
				if (child != null)
				{
					break;
				}
			}
			return child;
		} 
	

		private void dgSalida_PreviewKeyDown(object sender, KeyEventArgs e)
		{
			#region FJRF - Saber Fila y Columna indexada

			int IntColumnaIndexada, IntFilaIndexada;
			DependencyObject dep = (DependencyObject)e.OriginalSource;

			//Stepping through the visual tree
			while ((dep != null) && !(dep is System.Windows.Controls.DataGridCell))
			{
				dep = VisualTreeHelper.GetParent(dep);
			}

			//Is the dep a cell or outside the bounds of Window1?
			if (dep == null | !(dep is System.Windows.Controls.DataGridCell))
			{
				return;
			}
			else
			{
				System.Windows.Controls.DataGridCell cell = new System.Windows.Controls.DataGridCell();
				cell = (System.Windows.Controls.DataGridCell)dep;
				while ((dep != null) && !(dep is DataGridRow))
				{
					dep = VisualTreeHelper.GetParent(dep);
				}

				if (dep == null)
				{
					return;
				}
				int colindex = cell.Column.DisplayIndex;  //this returns COLUMN INDEX
				IntColumnaIndexada = colindex;

				DataGridRow row = dep as DataGridRow;
				System.Windows.Controls.DataGrid dataGrid = ItemsControl.ItemsControlFromItemContainer(row) as System.Windows.Controls.DataGrid;
				int rowindex = dataGrid.ItemContainerGenerator.IndexFromContainer(row); //this returns ROW INDEX

				IntFilaIndexada = rowindex;
			}
			#endregion

			int IntFilaActual, IntCantidadRegistros, IntRegistrosActuales;//FJRF Creamos las variables que necesitamos para el proceso actual

			IntCantidadRegistros = dgSalida.Items.Count;//FJRF - Traemos la cantidad de filas que tenga el grid

			IntFilaActual = IntFilaIndexada + 1;//FJRF - La fila actual es la fila indexada mas uno porque empieza en cero
			IntRegistrosActuales = IntCantidadRegistros - 1;//FJRF - Los registros actuales es la cantidad de filas menos una porque siempre debe de sobrar una

			var elemento = e.OriginalSource as UIElement;

			
			if (e.Key == Key.Enter || e.Key == Key.Down || e.Key == Key.Up || e.Key == Key.Right && elemento != null)//FJRF - Si se presiono enter, elemento es diferente de nulo o usa las teclas de desplazamiento hacemos lo siguiente
			{
				if (IntFilaActual >= IntRegistrosActuales)//FJRF - Si la fila es mayor o igual a la cantidad de registros hacemos lo siguiente
				{
					Lista.Add(new RegDetSal { CODIGO_SAL = "", DESCRIPCION_SAL = "", COLOR_SAL = "", UNICOM_SAL = "", EXIST_SAL = 0, STAND_SAL = 0, ENTREG_SAL = 0, CANT_SAL = 0, COSTO_SAL = 0, SUBTOTAL_SAL = 0 });//FJRF - Adicionamos un nuevo registro
					dgSalida.ItemsSource = Lista;//FJRF - Agregamos el nuevo registro a la lista
				}
				if (e.Key == Key.Down || e.Key == Key.Up || e.Key == Key.Right)//FJRF - Si usas las techas de navegacion hacemos lo siguiente
				{
					//FJRF - No hacer nada para que el foco permanezca en el grid y lo comento aqui para que lo entiendan
				}
				else//FJRF - Si no esta usando las teclas de navegacion hacemos lo siguiente
				{
					if (IntColumnaIndexada == 0)//FJRF - Si la columna equivale al codigo hacemos lo siguiente
					{
						e.Handled = true;//FJRF - Le decimos que vamos a trabajar sobre un control
						SelectCellByIndex(dgSalida, IntFilaIndexada, 7);//FJRF - Le decimos cual es la nueva posicion
					}
					else//FJRF - si no es la columna del codigo hacemos lo siguiente
					{
						//DataGridCell cell = GetCell(IntFilaIndexada, 0, dgSalida);
						//cell.Background = new SolidColorBrush(Colors.AliceBlue);

						if (IntColumnaIndexada == 7)//FJRF - Si la columna equivale a la cantidad entonces hacemos lo siguiente
						{
							e.Handled = true;//FJRF - Le decimos que vamos a trabajar sobre un control
							SelectCellByIndex(dgSalida, IntFilaActual, 0);//FJRF - Le decimos cual es la nueva posicion
						}
						else//FJRF - Si es cualquier otra celda hacemos lo siguiente
						{
							if (IntFilaActual <= IntRegistrosActuales)//FJRF - Si la fila es igual o menor a la cantidad de registros hacemos lo siguiente
							{
								e.Handled = true;//FJRF - Le decimos que vamos a trabajar sobre un control
								elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));//FJRF - Nos movemos a la siguiente posicion
							}
						}
					}
				}
			}
		}
		

		//
		// SINGLE CLICK EDITING
		//
		private void DataGridCell_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
		{
			DataGridCell cell = sender as DataGridCell;
			if (cell != null && !cell.IsEditing && !cell.IsReadOnly)
			{
				if (!cell.IsFocused)
				{
					cell.Focus();
				}
				DataGrid dataGrid = FindVisualParent<DataGrid>(cell);
				if (dataGrid != null)
				{
					if (dataGrid.SelectionUnit != DataGridSelectionUnit.FullRow)
					{
						if (!cell.IsSelected)
							cell.IsSelected = true;
					}
					else
					{
						DataGridRow row = FindVisualParent<DataGridRow>(cell);
						if (row != null && !row.IsSelected)
						{
							row.IsSelected = true;
						}
					}
				}
			}
		}

		static T FindVisualParent<T>(UIElement element) where T : UIElement
		{
			UIElement parent = element;
			while (parent != null)
			{
				T correctlyTyped = parent as T;
				if (correctlyTyped != null)
				{
					return correctlyTyped;
				}

				parent = VisualTreeHelper.GetParent(parent) as UIElement;
			}
			return null;
		}

		#region FJRF - MsgboxPersonalizado
		protected void Msgbox(String StrCaption, String StrMensaje, MessageBoxButton MsbTipoBoton, MessageBoxImage MsbTipoImagenIcono)
		{
			MessageBoxButton buttons;
			buttons = MsbTipoBoton;

			MessageBoxImage icon = MsbTipoImagenIcono;
			MessageBox.Show(StrMensaje, StrCaption, buttons, icon);
		}
		#endregion

		#region FJRF - ParaObtenerLasPropiedadesDeLaCeldaDelGrid
		static class DataGridHelper
		{
			static public DataGridCell GetCell(DataGrid dg, int row, int column)
			{
				DataGridRow rowContainer = GetRow(dg, row);

				if (rowContainer != null)
				{
					DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);

					// try to get the cell but it may possibly be virtualized
					DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
					if (cell == null)
					{
						// now try to bring into view and retreive the cell
						dg.ScrollIntoView(rowContainer, dg.Columns[column]);
						cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
					}
					return cell;
				}
				return null;
			}

			static public DataGridRow GetRow(DataGrid dg, int index)
			{
				DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
				if (row == null)
				{
					// may be virtualized, bring into view and try again
					dg.ScrollIntoView(dg.Items[index]);
					row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
				}
				return row;
			}

			static T GetVisualChild<T>(Visual parent) where T : Visual
			{
				T child = default(T);
				int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
				for (int i = 0; i < numVisuals; i++)
				{
					Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
					child = v as T;
					if (child == null)
					{
						child = GetVisualChild<T>(v);
					}
					if (child != null)
					{
						break;
					}
				}
				return child;
			}
		}
		#endregion

		#region FJRF - ParaAlinearALaDerecha
		public static Style newCellStyleAlinearDerecha()
		{
			System.Windows.Style style = new Style(typeof(DataGridCell));
			style.Setters.Add(new System.Windows.Setter
			{
				Property = Control.HorizontalAlignmentProperty,
				Value = HorizontalAlignment.Right
			});
			return style;
		}
		#endregion

		#region FJRF - ParaRetornarElValorDeUnaCeldaDeUnDataGrid
		private string ReturnDataGridCellText(DataGrid Dtg, object ObjItemFila, int IntColumna)
		{
			string strValorRetornado = "";//FJRF - Limpiamos el valor a retornar

			DataGridRow row = (DataGridRow)Dtg.ItemContainerGenerator.ContainerFromItem(ObjItemFila);//FJRF - Miramos cual es la fila a consultar
			TextBlock cellContent = Dtg.Columns[IntColumna].GetCellContent(row) as TextBlock;//FJRF - Enviamos el dato de la fila y la columna para tener el dato de la celda

			if (cellContent == null)
			{
				strValorRetornado = "";//FJRF - Retornamos el valor de la celda solo el texto
			}
			else
			{
				strValorRetornado = cellContent.Text;//FJRF - Retornamos el valor de la celda solo el texto
			}

			return strValorRetornado.Trim();//FJRF - Retornamos el valor sin espacion
		}
		#endregion

		#region FJRF - PonerFoto

		private void PonerImagen(string strCodigoReferencia, string strCodigoColor, string strNombreReferencia)
		{
			if (String.IsNullOrEmpty(strCodigoColor))
			{
				BitmapImage b = new BitmapImage();
				if (File.Exists(MDOgeneral.Fotos_BOSI + strCodigoReferencia + ".jpg"))
				{
					b.BeginInit();
					b.UriSource = new Uri(MDOgeneral.Fotos_BOSI + strCodigoReferencia + ".jpg");
					b.EndInit();
					imgFoto.Stretch = Stretch.Fill;
					imgFoto.Source = b;
					ImagenTooltip.Source = b;
					txbNombreImagen.Text = strNombreReferencia;
				}
				else
				{
					imgFoto.Source = null;
				}
			}
			else
			{
				BitmapImage b = new BitmapImage();
				if (File.Exists(MDOgeneral.Fotos_BOSI + strCodigoReferencia + strCodigoColor + ".jpg"))
				{
					b.BeginInit();
					b.UriSource = new Uri(MDOgeneral.Fotos_BOSI + strCodigoReferencia + strCodigoColor + ".jpg");
					b.EndInit();
					imgFoto.Stretch = Stretch.Fill;
					imgFoto.Source = b;
					ImagenTooltip.Source = b;
					txbNombreImagen.Text = strNombreReferencia;
				}
				else
				{
					if (File.Exists(MDOgeneral.Fotos_BOSI + strCodigoReferencia + StrCodigoPrimerColorReferencia + ".jpg"))
					{
						b.BeginInit();
						b.UriSource = new Uri(MDOgeneral.Fotos_BOSI + strCodigoReferencia + StrCodigoPrimerColorReferencia + ".jpg");
						b.EndInit();
						imgFoto.Stretch = Stretch.Fill;
						imgFoto.Source = b;
						ImagenTooltip.Source = b;
						txbNombreImagen.Text = strNombreReferencia;
					}
					else
					{
						Boolean BooExiste = false;
						//Foto para cualquier color-Consultar colores para referencia
						clases.CLSMAEPRO mae = new clases.CLSMAEPRO { CODREF_PRO = strCodigoReferencia };
						DataTable val = mae.BuscarColor();

						foreach (DataRow r in val.Rows)
						{
							if (!String.IsNullOrEmpty(r["Codigo"].ToString()))
							{
								string StrRuta = MDOgeneral.Fotos_BOSI + strCodigoReferencia + r["Codigo"].ToString() + ".jpg";
								if (File.Exists(StrRuta))
								{
									BitmapImage BitFoto = new BitmapImage();
									BitFoto.BeginInit();
									BitFoto.UriSource = new Uri(StrRuta);
									BitFoto.EndInit();
									imgFoto.Source = BitFoto;
									ImagenTooltip.Source = BitFoto;
									txbNombreImagen.Text = strNombreReferencia;

									BooExiste = true;

									break;//FJRF - Si la encontro nos salimos
								}
							}
						}

						if (BooExiste == false)
						{
							imgFoto.Source = null;
						}
					}
				}
			}
		}

		#endregion

		#region FJRF - FuncionesEspecialesParaLasPropiedadesDeLaCeldaYElFoco

		public static T FindVisualChild<T>(DependencyObject obj) where T : DependencyObject
		{
			for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
			{
				DependencyObject child = VisualTreeHelper.GetChild(obj, i);
				if (child != null && child is T)
					return (T)child;
				else
				{
					T childOfChild = FindVisualChild<T>(child);
					if (childOfChild != null)
						return childOfChild;
				}
			}
			return null;
		}
		public static DataGridCell GetCell(DataGrid dataGrid, DataGridRow rowContainer, int column)
		{
			if (rowContainer != null)
			{
				DataGridCellsPresenter presenter = FindVisualChild<DataGridCellsPresenter>(rowContainer);
				if (presenter == null)
				{
					/* if the row has been virtualized away, call its ApplyTemplate() method 
					 * to build its visual tree in order for the DataGridCellsPresenter
					 * and the DataGridCells to be created */
					rowContainer.ApplyTemplate();
					presenter = FindVisualChild<DataGridCellsPresenter>(rowContainer);
				}
				if (presenter != null)
				{
					DataGridCell cell = presenter.ItemContainerGenerator.ContainerFromIndex(column) as DataGridCell;
					if (cell == null)
					{
						/* bring the column into view
						 * in case it has been virtualized away */
						dataGrid.ScrollIntoView(rowContainer, dataGrid.Columns[column]);
						cell = presenter.ItemContainerGenerator.ContainerFromIndex(column) as DataGridCell;
					}
					return cell;
				}
			}
			return null;
		}
		public static void SelectRowByIndexes(DataGrid dataGrid, params int[] rowIndexes)
		{
			if (!dataGrid.SelectionUnit.Equals(DataGridSelectionUnit.FullRow))
				throw new ArgumentException("The SelectionUnit of the DataGrid must be set to FullRow.");

			if (!dataGrid.SelectionMode.Equals(DataGridSelectionMode.Extended))
				throw new ArgumentException("The SelectionMode of the DataGrid must be set to Extended.");

			if (rowIndexes.Length.Equals(0) || rowIndexes.Length > dataGrid.Items.Count)
				throw new ArgumentException("Invalid number of indexes.");

			dataGrid.SelectedItems.Clear();
			foreach (int rowIndex in rowIndexes)
			{
				if (rowIndex < 0 || rowIndex > (dataGrid.Items.Count - 1))
					throw new ArgumentException(string.Format("{0} is an invalid row index.", rowIndex));

				object item = dataGrid.Items[rowIndex]; //=Product X
				dataGrid.SelectedItems.Add(item);

				DataGridRow row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
				if (row == null)
				{
					dataGrid.ScrollIntoView(item);
					row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
				}
				if (row != null)
				{
					DataGridCell cell = GetCell(dataGrid, row, 0);
					if (cell != null)
						cell.Focus();
				}
			}
		}
		public static void SelectCellByIndex(DataGrid dataGrid, int rowIndex, int columnIndex)
		{
			if (!dataGrid.SelectionUnit.Equals(DataGridSelectionUnit.Cell))
				throw new ArgumentException("The SelectionUnit of the DataGrid must be set to Cell.");

			if (rowIndex < 0 || rowIndex > (dataGrid.Items.Count - 1))
				throw new ArgumentException(string.Format("{0} is an invalid row index.", rowIndex));

			if (columnIndex < 0 || columnIndex > (dataGrid.Columns.Count - 1))
				throw new ArgumentException(string.Format("{0} is an invalid column index.", columnIndex));

			dataGrid.SelectedCells.Clear();

			object item = dataGrid.Items[rowIndex]; //=Product X
			DataGridRow row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
			if (row == null)
			{
				dataGrid.ScrollIntoView(item);
				row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
			}
			if (row != null)
			{
				DataGridCell cell = GetCell(dataGrid, row, columnIndex);
				if (cell != null)
				{
					DataGridCellInfo dataGridCellInfo = new DataGridCellInfo(cell);
					dataGrid.SelectedCells.Add(dataGridCellInfo);

					cell.Focus();
				}
			}
		}
		#endregion

		private void dgSalida_GotFocus(object sender, RoutedEventArgs e)
		{
			if (rbProduccion.IsChecked == true)
			{
				if (txtCodPrv.Text == "")
				{
					Msgbox("ADVERTENCIA", "Falta digitar el código de la orden", MessageBoxButton.OK, MessageBoxImage.Warning);
					txtCodPrv.Focus();
					return;
				}
			}
			if (rbDevolucion.IsChecked == true)
			{
				if (txtCodPrv.Text == "")
				{
					Msgbox("ADVERTENCIA", "Falta digitar el código del proveedor", MessageBoxButton.OK, MessageBoxImage.Warning);
					txtCodPrv.Focus();
					return;
				}
			}
			if (txtObs.Text == "")
			{
				if (rbProduccion.IsChecked == true)
				{
					txtObs.Text = "Orden de producción número [ " + txtCodPrv.Text.Trim() + " ] ";
				}
				else
				{
					if (String.IsNullOrEmpty(StrCodigoOrdenAutomatica) == false)
					{
						//FJRF - No hacemos nada
					}
					else
					{
						Msgbox("ADVERTENCIA", "Falta digitar una observación", MessageBoxButton.OK, MessageBoxImage.Warning);
						txtObs.Focus();
						return;
					}
				}
			}
		}
		private void EjecutarSP_PROSALP(string strTipoEntrada, string strNumeroEntrada)//FJRF - Este procedimiento ejecuta un sp
		{
			try
			{
				MDOgeneral.spComando.CommandText = "SP_PROSALP";
				MDOgeneral.spComando.Connection = MDOgeneral.conexion;
				MDOgeneral.spComando.CommandType = CommandType.StoredProcedure;
				MDOgeneral.spComando.Parameters.Clear();

				//Input
				MDOgeneral.spComando.Parameters.Add("pva_tipsal", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = String.IsNullOrEmpty(strTipoEntrada) ? "" : strTipoEntrada;
				MDOgeneral.spComando.Parameters.Add("pva_hojnro", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = String.IsNullOrEmpty(strNumeroEntrada) ? "" : strNumeroEntrada;

				//Output salidas
				MDOgeneral.spComando.Parameters.Add("pva_result", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
				MDOgeneral.spComando.Parameters.Add("pva_errusu", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
				MDOgeneral.spComando.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }
		}

		private String StrEjecutarSP_NROSALPRD(string str_pva_nroord)//FJRF - Este procedimiento ejecuta un sp
		{
			String StrNumeroHoja = "";
			try
			{
				if (String.IsNullOrEmpty(str_pva_nroord) == true)
				{
					return StrNumeroHoja;
				}
				else
				{
					MDOgeneral.spComando.CommandText = "SP_NROSALPRD";
					MDOgeneral.spComando.Connection = MDOgeneral.conexion;
					MDOgeneral.spComando.CommandType = CommandType.StoredProcedure;
					MDOgeneral.spComando.Parameters.Clear();

					//Input
					MDOgeneral.spComando.Parameters.Add("pva_nroord", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = String.IsNullOrEmpty(str_pva_nroord) ? "" : str_pva_nroord;

					//Output salidas
					MDOgeneral.spComando.Parameters.Add("pva_result", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
					MDOgeneral.spComando.Parameters.Add("pva_errusu", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
					MDOgeneral.spComando.ExecuteNonQuery();

					StrNumeroHoja = MDOgeneral.spComando.Parameters["pva_errusu"].Value.ToString();//FJRF - Recibimos el valor retornado

					return StrNumeroHoja;
				}
			}
			catch (Exception ex) 
			{ 
				return StrNumeroHoja;
			}
		}

		private void dtFecSal_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
		{
			if (dtFecSal.SelectedDate != null)//FJRF - Verificamos que la fecha no venga nula
			{
				MDOgeneral.DttFechaDigitadaPorusuario = dtFecSal.SelectedDate.Value;//FJRF - Extraemos la fecha digitada por el usuario

				if (btnGrabar.IsEnabled == true)//FJRF - Si el grabar esta habilitado hacemos la validacion
				{
					#region FJRF - ValidamosFechaDigitada
					if (MDOgeneral.DttFechaDigitadaPorusuario < MDOgeneral.DttFechaInicialDeValidacionEnElSistema)//FJRF - Preguntamos si la fecha digitada es menor a la fecha minima permitida y si lo es hacemos lo siguiente
					{
						Msgbox("PROCESO DE SELECCION DE FECHA CANCELADO", "La fecha digitada [ " + MDOgeneral.DttFechaDigitadaPorusuario.ToLongDateString() + " ] no puede ser inferior a la fecha minima en la que se puede trabajar en el sistema [" + MDOgeneral.DttFechaInicialDeValidacionEnElSistema.ToLongDateString() + "]", MessageBoxButton.OK, MessageBoxImage.Warning);//FJRF - Enviamos un mensaje al usuario
						dtFecSal.SelectedDate = MDOgeneral.DttFechaActualDeValidacionEnElSistema;//FJRF - Asignamos la fecha por defecto que tiene el sistema
					}
					else//FJRF - Si no es menor la fecha entonces hacemos lo siguiente
					{
						if (MDOgeneral.DttFechaDigitadaPorusuario > MDOgeneral.DttFechaFinalDeValidacionEnElSistema)//FJRF - Preguntamos si la fecha digitada el mayor a la fecha maxima permitida y si lo es hacemos lo siguiente
						{
							Msgbox("PROCESO DE SELECCION DE FECHA CANCELADO", "La fecha digitada [ " + MDOgeneral.DttFechaDigitadaPorusuario.ToLongDateString() + " ] no puede ser superior a la fecha maxima en la que se puede trabajar en el sistema [" + MDOgeneral.DttFechaFinalDeValidacionEnElSistema.ToLongDateString() + "]", MessageBoxButton.OK, MessageBoxImage.Warning);//FJRF - Enviamos un mensaje al usuario
							dtFecSal.SelectedDate = MDOgeneral.DttFechaActualDeValidacionEnElSistema;//FJRF - Asignamos la fecha por defecto que tiene el sistema
						}
					}
					#endregion
				}
			}
		}

		protected void PttV_ImprimirOrdenQueEstaEn_frmActOrd(String StrNumeroDeOrden)
		{
			StrTipoDeOrden = MdoGeneral.StrRetornarUnSoloCampo("TIPORD_EOP", "TipoOrden", "ENCORDP", "NROORD_EOP = '" + StrNumeroDeOrden + "'");
			if (StrTipoDeOrden == "DATO NO ENCONTRADO" || StrTipoDeOrden == "C")
			{
				return;//FJRF - Nos salimos
			}

			frmActOrd FrmImprimirOrden = new frmActOrd();
			FrmImprimirOrden.txtOrden.Text = StrNumeroDeOrden;
			FrmImprimirOrden.PubV_BuscarOrden(StrNumeroDeOrden);

			#region FJRF - ParaSaberElNumeroDeCopiasAImprimir

			int IntNumeroCopias = 0;//FJRF - Para saber el numero de copias que se deben efectuar... se carga por defecto con una
			string StrVieneDe = "", strNumeroCopias = "";//FJRF - Variable para saber de donde viene el formulario

			if (String.IsNullOrEmpty(MDOgeneral.strImprimirNoCopias) == false)//FJRF - Si la variable trae datos hacemos lo siguiente
			{
				strNumeroCopias = MdoGeneral.PasarCadenaYRetornarCodigoONombre(MDOgeneral.strImprimirNoCopias, "-", "Codigo").Trim();//Extraemos el numero de copias
				StrVieneDe = MdoGeneral.PasarCadenaYRetornarCodigoONombre(MDOgeneral.strImprimirNoCopias, "-", "Nombre").Trim();//FJRF - Extraemos el nombre de donde viene el formulario solo para saber a nivel informativo para control de codigo

				if (String.IsNullOrEmpty(strNumeroCopias) == true)//FJRF - Si viene vacio entonces hacemos lo siguiente
				{
					IntNumeroCopias = 1;//FJRF - Ponemos una copia por defecto
				}
				else//FJRF - Si trae datos entonces hacemos lo siguiente
				{
					IntNumeroCopias = int.Parse(strNumeroCopias);//FJRF - Ponemos el numero de copias asignado
				}
			}

			#endregion

			if (IntNumeroCopias > 0)
			{
				FrmImprimirOrden.PubV_ImprimirOrden(StrNumeroDeOrden, IntNumeroCopias);
			}
		}

		private void txtCodPrv_KeyDown(object sender, KeyEventArgs e)
		{
			if (e.Key == Key.Enter)//FJRF - Si el usuario digita enter entonces hacemos lo siguiente
			{
				if (rbProduccion.IsChecked == true)
				{
					if (txtObs.Text == "")
					{
						txtObs.Text = "Orden de producción número [ " + txtCodPrv.Text.Trim() + " ] ";
					}
				}
				if (txtObs.Text == "")
				{
					txtObs.Text = "Ninguna";
				}

				dgSalida.Focus();//FJRF - Ponemos el foco en el grid
				e.Handled = true;//FJRF - Le decimos que vamos a trabajar sobre un control
				SelectCellByIndex(dgSalida, 0, 0);//FJRF - Le decimos cual es la nueva posicion
			}
		}

		private void imgFoto_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
		{
			try
			{
				//Para llamar el PDF de la ficha tecnica de la referencia
				if (File.Exists(MDOgeneral.Fotos_BOSI + txtRef.Text.Trim() + ".PDF"))
				{
					//MessageBox.Show("Si existe la ficha tecnica", "Confirmación", MessageBoxButton.OK, MessageBoxImage.Hand, MessageBoxResult.OK);
                    String fileName = MDOgeneral.Fotos_BOSI + txtRef.Text.Trim() + ".PDF";
					System.Diagnostics.Process process = new System.Diagnostics.Process();
					process.StartInfo.FileName = fileName;
					process.Start();
				}
				else
				{
					MessageBox.Show("No existe la ficha tecnica", "Confirmación", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK);
				}
			}
			catch (Exception ex) { MessageBox.Show(ex.Message); }
		}
	}

		public class RegDetSal : ObservableObject
		{            
			string codigo_sal, descripcion_sal, unicom_sal, Color_sal;
			double exist_sal, cant_sal, costo_sal, subtotal_sal, stand_sal, entreg_sal;

			public string CODIGO_SAL
			{
				get { return codigo_sal; }
				set 
				{
					if (value == null)
					{
					}
					else//FJRF - Si el codigo es diferente de nulo hacemos lo siguiente
					{
						codigo_sal = value.ToUpper();
						
						CLSENCSAL EncSal = new CLSENCSAL();
						CLSDETSAL DetSal = new CLSDETSAL();
						if (codigo_sal.Length > 0)
						{
							if (codigo_sal.Trim().Replace("\r", "").Length == 10)
							{
								if (EncSal.ExisteMP(value.ToString().Substring(0, 6).ToUpper(), value.ToString().Substring(6, 4).ToUpper()))
								{
									DESCRIPCION_SAL = EncSal.NombreMP(value.ToString().Substring(0, 6).Trim().Replace("\r", ""), value.ToString().Substring(6, 4).Trim().Replace("\r", ""));
									COLOR_SAL = EncSal.ColorMP(value.ToString().Substring(0, 6).Trim().Replace("\r", ""), value.ToString().Substring(6, 4).Trim().Replace("\r", ""));//FJRF - Buscamos el color
									if (EXIST_SAL.ToString() == "" || EXIST_SAL == 0)
									{
										EXIST_SAL = EncSal.ExistenciaMP(value.ToString().Substring(0, 6), value.ToString().Substring(6, 4));
									}
									if (COSTO_SAL.ToString() == "" || COSTO_SAL == 0)
									{
										COSTO_SAL = EncSal.CostoMP(value.ToString().Substring(0, 6), value.ToString().Substring(6, 4));
									}
									UNICOM_SAL = DetSal.UniComMP(value.ToString().Substring(0, 6));
								}
							}
						}
						RaisePropertyChangedEvent("CODIGO_SAL");                    
					}
				}
			}

			public string DESCRIPCION_SAL
			{
				get { return descripcion_sal; }
				set { descripcion_sal=value.ToUpper();
				RaisePropertyChangedEvent("DESCRIPCION_SAL");
				}
			}
			public string COLOR_SAL
			{
				get { return Color_sal; }
				set
				{
					Color_sal = value;
					RaisePropertyChangedEvent("COLOR_SAL");
				}
			}

			public string UNICOM_SAL
			{
				get { return unicom_sal; }
				set
				{
					unicom_sal = value;
					RaisePropertyChangedEvent("UNICOM_SAL");
				}
			}

			public double EXIST_SAL
			{
				get { return exist_sal; }
				set { exist_sal = value;
				RaisePropertyChangedEvent("EXIST_SAL");
				}
			}

			public double STAND_SAL
			{
				get { return stand_sal; }
				set
				{
					stand_sal = value;
					RaisePropertyChangedEvent("STAND_SAL");
				}
			}
			
			public double ENTREG_SAL
			{
				get { return entreg_sal; }
				set
				{
					entreg_sal = value;
					RaisePropertyChangedEvent("ENTREG_SAL");
				}
			}

			public double CANT_SAL
			{
				get { return cant_sal; }
				set 
				{ 
					cant_sal = value;
					/*
					if (value > 0)
					{
						CLSMAEMTP MaeMtp = new CLSMAEMTP();
						MaeMtp.CODMAT_MTP = CODIGO_SAL.Substring(0, 6);
						MaeMtp.CODCOL_MTP = CODIGO_SAL.Substring(6, 2);
						MaeMtp.CANSEP_MTP = cant_sal;
						MaeMtp.SumarSep();
					}*/
					RaisePropertyChangedEvent("CANT_SAL");
				}
			}

			public double COSTO_SAL
			{
				get { return costo_sal; }
				set
				{
					costo_sal = value;
					RaisePropertyChangedEvent("COSTO_SAL");
				}
			}

			public double SUBTOTAL_SAL
			{
				get { return subtotal_sal ; }
				set { subtotal_sal = COSTO_SAL*CANT_SAL;
				RaisePropertyChangedEvent("SUBTOTAL_SAL");
				}
			}


			//public event PropertyChangedEventHandler PropertyChanged;
	}

}

namespace ValidarSalMP
{
	using System.Data;
	using produccion.forms;
	internal class ValidarCodigo : ValidationRule
	{
		public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
		{
			if (value != null)
			{
				if (value.ToString().Length > 10 || value.ToString().Length < 10)
				{
					return new ValidationResult(false, "El código debe ser de 10 caracteres");
				}

				CLSENCSAL EncSal = new CLSENCSAL();
				if (!EncSal.ExisteMP(value.ToString().Substring(0, 6), value.ToString().Substring(6, 4)))
				{
					return new ValidationResult(false, "El código de materia prima no existe");
				}                
			}

			return new ValidationResult(true, null);
		}
	}

	internal class ValidarVal : ValidationRule
	{
		public DataGrid Dg { get; set; }
		public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
		{
			String StrValorDigitado, StrValidar;//FJRF - Para mirar el valor digitado
			if (value.ToString() == null)
			{
				return new ValidationResult(false, "El valor no puede estar nulo");
			}
			else
			{
				if (value.ToString().Trim().Equals(""))
				{
					return new ValidationResult(false, "El valor no puede estar vacío");
				}
				else
				{
					StrValorDigitado = value.ToString().Trim();
				}
			}
			if (!IsNumeric(StrValorDigitado))
			{
				return new ValidationResult(false, "El valor debe ser numérico");
			}
			if (StrValorDigitado.Substring(0, 1) == ".")
			{
				StrValidar = "0" + StrValorDigitado;

				if (Double.Parse(StrValidar.Replace(",", "")) < 0)
				{
					return new ValidationResult(false, "El valor no puede ser menor a cero");
				}
			}
			else
			{
				if (Double.Parse(StrValorDigitado.Replace(",", "")) < 0)
				{
					return new ValidationResult(false, "El valor no puede ser menor a cero");
				}
			}

			return new ValidationResult(true, null);
		}

		public bool IsNumeric(object Expression)
		{
			bool isNum;
			double retNum;

			isNum = Double.TryParse(Convert.ToString(Expression), System.Globalization.NumberStyles.Any, System.Globalization.NumberFormatInfo.InvariantInfo, out retNum);
			return isNum;
		}
	}
}